package Game5;

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

//存储新坦克诞生的消息，包装成类，在TankClient类中利用UDP把数据传输给服务端
public class TankNewMsg implements Msg{
    int msgType=Msg.TANK_NEW_MSG;
    Tank tank;
    GamePanel gp;

    public TankNewMsg(GamePanel gp) {
        this.gp=gp;
    }

    public TankNewMsg(Tank tank) {
        this.tank=tank;
    }
    //发包
    public void send(DatagramSocket ds,String IP,int udpPort) {
        //管道输出流，把要输出的信息先输入到管道流中
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        DataOutputStream dos=new DataOutputStream(baos);
        try {
            dos.writeInt(msgType);
            dos.writeInt(tank.id);
            dos.writeInt(tank.x);
            dos.writeInt(tank.y);
            //枚举类型数组下标值
            dos.writeInt(tank.direction.ordinal());
            //此处暂时没有写入tank类敌友，dos.writeBoolean(tank.good);后续进行改进
        } catch (IOException e) {
            e.printStackTrace();
        }
        //把管道流中的信息转成字节类型，然后用Packet对UDP进行传输
        byte[]buf= baos.toByteArray();
        //装包
        try {
            DatagramPacket dp=new DatagramPacket(buf,0,buf.length,new InetSocketAddress(IP,udpPort));
            ds.send(dp);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    //拆包
    public void parse(DataInputStream dis) {
        try {
            int id=dis.readInt();
            //目的是在不同的Client端看到不同ID号的坦克，所以如果传过来的ID就是该坦克，则没必要拆包
            if(gp.playerOne.id==id) {
                return;
            }
            int x=dis.readInt();
            int y=dis.readInt();
            int dir=dis.readInt();//读取方向的角标值，然后在实例化时根据角标值来确定新坦克的方向
            boolean exist=false;
            /*判断所收集到的坦克ID是否在所在的坦克列表中，如果不存在，则继续发送新坦克消息，并把该新坦克
            加入到坦克列表中完成打印
            */
            for (int i=0;i<gp.tankList.size();i++) {
                Tank t=gp.tankList.get(i);
                if(t.id==id) {
                    exist=true;
                    break;
                }
            }
            if(!exist) {
                TankNewMsg gpMsg=new TankNewMsg(gp.playerOne);
                gp.tc.send(gpMsg);
                Tank t=new Tank(x,y,dir,gp);
                t.id=id;
                gp.tankList.add(t);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
